package logger

import (
	"go.uber.org/zap"
)

// LoggerWrapper Zap 日志封装
type LoggerWrapper struct {
	logger *zap.Logger
	sugar  *zap.SugaredLogger
}

// NewLogger 创建日志实例
func NewLogger() LoggerWrapper {
	return LoggerWrapper{
		logger: Logger,
		sugar:  Sugar,
	}
}

// GetLogger 获取原始 Zap Logger
func (l *LoggerWrapper) GetLogger() *zap.Logger {
	return l.logger
}

// GetSugar 获取 Sugared Logger
func (l *LoggerWrapper) GetSugar() *zap.SugaredLogger {
	return l.sugar
}

// Sync 同步日志（刷新缓冲）
func (l *LoggerWrapper) Sync() error {
	if l.logger != nil {
		return l.logger.Sync()
	}
	return nil
}

// 结构化日志方法

// Debug 调试日志
func (l *LoggerWrapper) Debug(msg string, fields ...zap.Field) {
	if l.logger != nil {
		l.logger.Debug(msg, fields...)
	}
}

// Info 信息日志
func (l *LoggerWrapper) Info(msg string, fields ...zap.Field) {
	if l.logger != nil {
		l.logger.Info(msg, fields...)
	}
}

// Warn 警告日志
func (l *LoggerWrapper) Warn(msg string, fields ...zap.Field) {
	if l.logger != nil {
		l.logger.Warn(msg, fields...)
	}
}

// Error 错误日志
func (l *LoggerWrapper) Error(msg string, fields ...zap.Field) {
	if l.logger != nil {
		l.logger.Error(msg, fields...)
	}
}

// Fatal 致命错误日志（会终止程序）
func (l *LoggerWrapper) Fatal(msg string, fields ...zap.Field) {
	if l.logger != nil {
		l.logger.Fatal(msg, fields...)
	}
}

// 格式化日志方法（Sugared）

// Debugf 格式化调试日志
func (l *LoggerWrapper) Debugf(template string, args ...interface{}) {
	if l.sugar != nil {
		l.sugar.Debugf(template, args...)
	}
}

// Infof 格式化信息日志
func (l *LoggerWrapper) Infof(template string, args ...interface{}) {
	if l.sugar != nil {
		l.sugar.Infof(template, args...)
	}
}

// Warnf 格式化警告日志
func (l *LoggerWrapper) Warnf(template string, args ...interface{}) {
	if l.sugar != nil {
		l.sugar.Warnf(template, args...)
	}
}

// Errorf 格式化错误日志
func (l *LoggerWrapper) Errorf(template string, args ...interface{}) {
	if l.sugar != nil {
		l.sugar.Errorf(template, args...)
	}
}

// Fatalf 格式化致命错误日志
func (l *LoggerWrapper) Fatalf(template string, args ...interface{}) {
	if l.sugar != nil {
		l.sugar.Fatalf(template, args...)
	}
}

// With 添加上下文字段
func (l *LoggerWrapper) With(fields ...zap.Field) *zap.Logger {
	if l.logger != nil {
		return l.logger.With(fields...)
	}
	return nil
}

// WithFields 添加上下文字段（Sugared）
func (l *LoggerWrapper) WithFields(keysAndValues ...interface{}) *zap.SugaredLogger {
	if l.sugar != nil {
		return l.sugar.With(keysAndValues...)
	}
	return nil
}

// 便捷方法 - 带字段的结构化日志

// DebugWith 带字段的调试日志
func (l *LoggerWrapper) DebugWith(msg string, key string, value interface{}) {
	l.Debug(msg, zap.Any(key, value))
}

// InfoWith 带字段的信息日志
func (l *LoggerWrapper) InfoWith(msg string, key string, value interface{}) {
	l.Info(msg, zap.Any(key, value))
}

// WarnWith 带字段的警告日志
func (l *LoggerWrapper) WarnWith(msg string, key string, value interface{}) {
	l.Warn(msg, zap.Any(key, value))
}

// ErrorWith 带字段的错误日志
func (l *LoggerWrapper) ErrorWith(msg string, key string, value interface{}) {
	l.Error(msg, zap.Any(key, value))
}
